import Dep from './Dep'
import observe from './observe'


export default function (data, key, val = data[key]) {
  // 每一个响应式的对象都要有自己的依赖
  const dep = new Dep()
  let childOb = observe(val) // 这一个 childOb 就形成了子对象的响应式

  Object.defineProperty(data, key, {
    configurable: true,
    enumerable: true,
    get() {
      if (Dep.target) {
        dep.depend()
        if (childOb) {
          childOb.dep.depend()
        }
      }
      return val
    },
    set(value) {
      if (value === val) {
        return;
      }
      val = value
      // 新添加的数据也要变成响应式
      childOb = observe(value)
      // 发布订阅者模式，通知 Dep 收集
      dep.notify()
    }
  })
}